package com.cty.servlet.servlet3;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @Auther: cty
 * @Date: 2020/2/20 20:33
 * @Description: 访问其他servlet
 * 一、请求转发
 *		作用:实现多个servlet联动操作处理请求，这样避免代码冗余，让servlet的职责更加明确。
 *		使用：
 *		    req.getRequestDispatcher(String uri).forward(req, resp);
 *			地址：（/代表IP:port/项目名/）
 *              uri相对路径时与重定向情况一样。
 *              uri绝对路径，即/路径和文件名，建议使用
 *		特点:
 *			一次请求，浏览器地址栏信息不改变。
 *		注意：
 *			请求转发后直接return结束即可。
 * 二、reuqet作用域：
 *	    作用：解决了一次请求内的servlet的数据共享问题
 *		使用：
 *	        req.setAttribute("str", "把字符串数据存入request作用域");
 *	        req.getAttribute("str");
 *
 * 三、重定向
 *		解决了表单重复提交的问题，以及当前servlet无法处理的请求的问题。
 *		使用:
 *			resp.sendRedirect(String uri);
 *          地址：（/代表IP:port/）
 *              uri为相对路径：从当前目录下寻找uri
 *                  若当前servlet中的别名不包含目录，如/login，则重定向路径
 *                  若当前servlet中的别名包含目录，如mylogin/login，则在重定向路径为mylogin/uri，可能会造成重定向资源查找失败。
 *              uri为绝对路径：重定向路径直接为绝对路径，建议使用
 *		示例:
 *			resp.sendRedirect("/login/main");
 *		特点：
 *			两次请求，两个request对象。
 *			浏览器地址栏信息改变
 *		时机：
 *			如果请求中有表单数据，而数据又比较重要，不能重复提交，建议使用重定向。
 *			如果请求被Servlet接收后，无法进行处理，建议使用重定向定位到可以处理的资源。
 *
 * 四、总结
 *      service请求处理代码流程：
 * 		    设置请求编码格式
 * 			设置响应编码格式
 * 			获取请求数据
 * 			处理请求数据
 * 		        直接处理然后响应处理结果
 * 		        请求转发
 * 		        重定向
 *
 * @version: 1.0
 */
@WebServlet(name = "TransferServlet")
public class TransferServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置请求编码格式
        req.setCharacterEncoding("utf-8");
        // 设置响应编码格式
        resp.setContentType("text/html;charset=utf-8");
        // 获取请求数据
            // request作用域
            req.setAttribute("str", "把字符串数据存入request作用域");
            // 请求转发
            req.getRequestDispatcher("/login").forward(req, resp);
            return;
            // 重定向
//            resp.sendRedirect("/myservlet/login");
    }
}
